#include "libSI.h"

/***************************** Include Files ********************************/
#include <xbasic_types.h>
#include <xstatus.h>




//*********************************************************************
// FUNCIONES PARA EL ADAPTADOR_CIRCUITO

static volatile unsigned int palabrasPorEntradaTB;

int getPalabrasPorEntradaTB(){
	return palabrasPorEntradaTB;
}

void inicializarAdaptadorCircuito(int num){
	palabrasPorEntradaTB = num;
	pto_circuito_entrada = pto_adaptador_circuito;
	pto_circuito_salida = pto_adaptador_circuito + palabrasPorEntradaTB;
}

void escribirEntradaTB(unsigned int *dir){
	int i;
	for(i=0;i<palabrasPorEntradaTB;i++){
		*(pto_circuito_entrada+i) = *(dir+i);
	}
}

void leerEntradaTB(unsigned int *dir){
	int i;
	for(i=0;i<palabrasPorEntradaTB;i++){
		*(dir+i) = *(pto_circuito_salida+i);
	}
}

//*********************************************************************
// FUNCIONES PARA EL ADAPTADOR_UART - ENVIAR/RECIBIR POR PUERTO SERIE

void enviarDato(volatile unsigned int *dir){
	while(*pto_uart_salida_ocupada == 0xFFFFFFFF)
		;
	*pto_uart_salida = *dir;
}

void recibirDato(volatile unsigned int *dir){
	while(*pto_uart_entrada_lista != 0xFFFFFFFF)
		;
	*dir = *pto_uart_entrada;
	*pto_uart_entrada_lista = 0x00000000;
}

void enviarEntradaTB(volatile unsigned int *dir){
	int i;
	for(i=0;i<palabrasPorEntradaTB;i++){
		enviarDato(dir+i);
	}
}

void recibirEntradaTB(volatile unsigned int *dir){
	int i;
	for(i=0;i<palabrasPorEntradaTB;i++){
		recibirDato(dir+i);
	}
}

//Función necesaria antes de usar la UART
void inicializarUart(){
	*pto_uart_entrada_lista = 0x00000000;
}


//*********************************************************************
// FUNCIONES PARA EL ICAP

int inicializarIcap(XHwIcap * icap){
	int status;
	XHwIcap_Config *config;
	config = XHwIcap_LookupConfig(XPAR_XPS_HWICAP_0_DEVICE_ID);
	status = XHwIcap_CfgInitialize(icap,config,XPAR_XPS_HWICAP_0_BASEADDR);
	return status;
}

int programar_icap(XHwIcap * icap, Xuint32 *data, Xuint32 tamano){
	int status = 1;
	int i;
	Xuint32 palabra[2];

	for(i=0;i<tamano;i=i+2)
		{
		palabra[0] = data[i];
		if (i+1 < tamano)
			palabra[1] = data[i+1];
		else
			palabra[1] = 0x0;
		status = (XHwIcap_DeviceWrite(icap,palabra,2) + 1) * status;
		}
	return status;
}



